/*
 * @Description: 对象
 * @Author: rendc
 * @Date: 2025-10-30 11:12:31
 * @LastEditors: rendc
 * @LastEditTime: 2025-10-30 14:29:05
 */
// var person1 = {
//   name:'p1',
//   age:18,
//   gender:"男",
//   sayHello(){
//     console.log("hello,I'm"+this.name);
//   }
// }
// var person2 = {
//   name:'p2',
//   age:18,
//   gender:"男",
//   sayHello(){
//     console.log("hello,I'm"+this.name);
//   }
// }
// var person3 = {
//   name:'p3',
//   age:18,
//   gender:"男",
//   sayHello(){
//     console.log("hello,I'm"+this.name);
//   }
// }
// // 工厂模式
// function createPerson(name,age,gender){
//   var person = new Object();
//   person.name = name;
//   person.age = age;
//   person.gender = gender;
//   person.sayHello = function() {
//     console.log("hello,I'm "+ this.name);
//   }
//   return person;
// }
// var p1 = createPerson('zs',18,"男");
// var p2 = createPerson('ls',18,"女");
// var p3 = createPerson('ww',20,"男");
// // typeof p1
// console.log('🤡 CC - typeof p1:', typeof p1);
// console.log('🤡 CC - p1.constructor:', p1.constructor);

// // 构造函数 - 函数声明
// function Person(name,age,gender){
//   this.name = name;
//   this.age = age;
//   this.gender = gender;
//   this.sayHello = function() {
//     console.log("hello,I'm "+ this.name);
//   }
// }
// var p1 = new Person('zs',18,"男");
// var p2 = new Person('ls',18,"女");
// var p3 = new Person('ww',20,"男");

// console.log('🤡 CC - typeof p1:', typeof p1);
// // 
// // p1.constructor
// console.log('🤡 CC - p1.constructor:', p1.constructor);
// console.log('🤡 CC - p1.constructor===Person:', p1.constructor===Person);
// // 构造函数 - 函数表达式 
// var Person = function(name,age,gender){
//   this.name = name;
//   this.age = age;
//   this.gender = gender;
//   this.sayHello = function() {
//     console.log("hello,I'm "+ this.name);
//   }
// }

// // 构造函数 - 细化解析
// function Person(name,age,gender){
//   this.name = name;
//   this.age = age;
//   this.gender = gender;
//   this.sayHello = new Function('console.log("hello")');
// }

// 创建对象 - 原型模式
// 最初状态
// function Person(name,age,gender){
//   this.name = name;
//   this.age = age;
//   this.gender = gender;
//   // 构造函数内部 通过引用来实现函数的共享
//   this.sayHello = sayHello;
//   // this.sayHello = function() {
//   //   console.log("123-hello,I'm "+ this.name);
//   // }
// }
// function Dog(name,age,gender){
//   this.name = name;
//   this.age = age;
//   this.gender = gender;
//   // 构造函数内部 通过引用来实现函数的共享
//   this.sayHello = sayHello;
//   // this.sayHello = function() {
//   //   console.log("123-hello,I'm "+ this.name);
//   // }
// }
// // 把函数的定义转移到构造函数的外部
// function sayHello(){
//   console.log("hello",this.name);
// }
// var p1 = new Person('zs',18,"男");
// p1.sayHello();
// var p2 = new Person('ls',18,"女");
// p2.sayHello();
// 原型模式 
// 什么是原型？
// 每个函数都有的 prototype 属性
// prototype是一个对象
// 包含这个类型实例共享的属性和方法
// 所以 在 prototype 上定义的属性和方法 
// 就可以被这个类的对象实例所共享
function Person(name,age,gender){
  // 私有的属性和方法 还是用构造函数
  this.name = name;
  this.age = age;
  this.gender = gender;
  // 需要被共享的属性和方法 给到原型
  Person.prototype.sayName = function () {
  console.log(this.name);
  };
}

var p1 = new Person();
var p2 = new Person();
p1.sayName();
p2.sayName();